package com.whf.android.jar.web.route;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.text.Html;
import android.webkit.URLUtil;
import android.webkit.WebView;

import androidx.core.content.ContextCompat;

import com.whf.android.jar.base.delegate.BaseDelegate;
import com.whf.android.jar.web.WebDelegate;
import com.whf.android.jar.web.WebDelegateImpl;
import com.whf.android.jar.web.utils.HtmlUtils;

import org.jetbrains.annotations.NotNull;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


/**
 * 接管打电话、a标签等操作
 *
 * @author hf
 * @version 1.0
 */
public class Router {

    private Router() {
    }

    private static class Holder {
        private static final Router INSTANCE = new Router();
    }

    public static Router getInstance() {
        return Holder.INSTANCE;
    }

    /***
     * 接管打电话、a标签等操作
     * @param delegate：
     * @param url：
     */
    public final boolean handleWebUrl(WebDelegate delegate, @NotNull String url) {
        return handleWebUrl(delegate, url, true);
    }

    /***
     * 接管打电话、a标签等操作
     * @param delegate:
     * @param url:
     * @param isHandleWebUrl:设置是否跳转到新界面
     */
    public final boolean handleWebUrl(WebDelegate delegate, @NotNull String url, boolean isHandleWebUrl) {
        //如果是电话协议
        if (url.contains("tel:")) {
            callPhone(delegate.getContext(), url);
            return true;
        }
        //如果是短信协议
        if (url.contains("sm" + "sto:")) {
            callShortLetter(delegate.getContext(), url);
            return true;
        }
        //如果是邮件协议
        if (url.contains("mailto:")) {
            callShortLetter(delegate.getContext(), url);
            return true;
        }
        //如果是微信，支付宝
        if (url.contains("weixin:") || url.contains("alipays:")) {
            callALi(delegate.getContext(), url);
            return true;
        }
        //设置是否跳转到新界面
        if (isHandleWebUrl) {
            final BaseDelegate topDelegate = delegate.getTopDelegate();
            final WebDelegateImpl webDelegate = WebDelegateImpl.create(url);
            topDelegate.getSupportDelegate().start(webDelegate);
        }
        return true;
    }

    /**
     * @param webView：
     * @param url:渲染网络的网页
     */
    private void loadWebPage(WebView webView, String url) {
        if (webView != null) {
            webView.loadUrl(url);
        } else {
            throw new NullPointerException("WebView is null!");
        }
    }

    /**
     * @param webView：
     * @param url:渲染本地的网页
     */
    private void loadLocalPage(WebView webView, String url) {
        loadWebPage(webView, "file:///android_asset/" + url);
    }

    /**
     * @param webView：
     * @param url:调用渲染
     */
    private void loadPage(WebView webView, String url) {
        if (URLUtil.isNetworkUrl(url) || URLUtil.isAssetUrl(url)) {
            loadWebPage(webView, url);
        } else {
            loadLocalPage(webView, url);
        }
    }

    /**
     * @param delegate:用原生的方式模拟Web跳转并进行页面加载
     * @param url:调用渲染
     */
    public final void loadPage(@NotNull WebDelegate delegate, String url) {
        loadPage(delegate.getWebView(), url);
    }

    /**
     * @param webView：
     * @param data:渲染html内容的网页
     */
    private void loadWebData(WebView webView, String data) {
        if (webView != null) {
            webView.loadDataWithBaseURL(null, data, "text/html", "UTF-8", null);
        } else {
            throw new NullPointerException("WebView is null!");
        }
    }

    /**
     * @param delegate:用原生的方式模拟Web跳转并进行页面加载
     * @param data:渲染html内容的网页
     */
    public final void loadData(@NotNull WebDelegate delegate, String data) {

        String html = HtmlUtils.toHtml(data);

        Document docImg = Jsoup.parse(html);

        Elements elementImg = docImg.getElementsByTag("img");
        for (Element element : elementImg) {
            if (element != null && element.toString().length() > 0) {
                element.attr("width", "100%")
                        .attr("height", "auto");
            }
        }

        Document doc = Jsoup.parse(docImg.toString());

        Elements elementTab = doc.getElementsByTag("table");
        for (Element element : elementTab) {
            if (element != null && element.toString().length() > 0) {
                element.attr("width", "100%")
                        .attr("height", "auto");
            }
        }

        //设置富文本
        loadWebData(delegate.getWebView(), doc.toString());
    }


    /**
     * 打电话
     *
     * @param context：
     * @param uri：跳转到拨号界面 电话
     */
    private void callPhone(Context context, String uri) {
        //打电话
        final Intent intent = new Intent(Intent.ACTION_DIAL);
        final Uri data = Uri.parse(uri);
        intent.setData(data);
        ContextCompat.startActivity(context, intent, null);
    }

    /**
     * 发短信
     *
     * @param context：
     * @param uri：跳转到拨号界面 电话
     */
    private void callShortLetter(Context context, String uri) {
        //打电话
        final Intent intent = new Intent(Intent.ACTION_SENDTO);
        final Uri data = Uri.parse(uri);
        intent.setData(data);
        ContextCompat.startActivity(context, intent, null);
    }

    /**
     * 发送邮件
     *
     * @param context：
     * @param uri：跳转到拨号界面 电话
     */
    private void callMail(Context context, String uri) {
        //打电话
        final Intent intent = new Intent(Intent.ACTION_SENDTO);
        final Uri data = Uri.parse(uri);
        intent.setData(data);
        ContextCompat.startActivity(context, intent, null);
    }


    /**
     * @param context：
     * @param uri：跳转到微信，支付宝
     */
    private void callALi(Context context, String uri) {
        //微信，支付宝
        final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
        ContextCompat.startActivity(context, intent, null);
    }

}
